package com.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.pojo.Dish;
import com.pojo.Msg;
import com.service.DishService;
import com.shiro.controller.BaseController;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;


import javax.validation.Valid;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;


//@RequiresPermissions(value={"foodTable:*"}) 全部换成了继承shiro的BaseController
@Controller
public class DishController extends BaseController {
    @Autowired
    DishService dishService;

    @ResponseBody
    @RequestMapping("/checkdish")
    public Msg checkdish (@RequestParam("dName") String dName) {
        //数据库菜品名重复校验
        boolean b = dishService.checkDish(dName);
        if(b){
            return Msg.success();
        }else{
            return Msg.fail().add("va_msg", "菜品名不可用");
        }
    }

//    @Valid
    //插入,顺便上传图片：由于使用tomcat服务器，所以需要配置tomcat（没有使用云服务器）v1.0
    @RequestMapping(value="/dish",method= RequestMethod.POST)
    @ResponseBody
    public Msg saveDish (@RequestBody Dish dish,  BindingResult result) {
        if(result.hasErrors()){
            //校验失败，应该返回失败，在模态框中显示校验失败的错误信息
            Map<String, Object> map = new HashMap<>();
            List<FieldError> errors = result.getFieldErrors();
            for (FieldError fieldError : errors) {
                System.out.println("错误的字段名：" + fieldError.getField());
                System.out.println("错误信息：" + fieldError.getDefaultMessage());
                map.put(fieldError.getField(), fieldError.getDefaultMessage());
            }
            return Msg.fail().add("errorFields", map);
        }else{
//            if(dishService.getDishByDId(dish.getdId())!=null){
//                dishService.updateDish(dish);
//            }else{
//                dishService.saveDish(dish);
//            }

            dishService.saveDish(dish);

            return Msg.success();
        }
    }


    //插入图片v2.0,接收商品图片
//    @RequestMapping(value="/dish",method= RequestMethod.POST)
//    @ResponseBody
//    public Msg saveDish (@RequestBody Dish dish,  BindingResult result, MultipartFile picture) throws IOException {
//        if(result.hasErrors()){
//            //校验失败，应该返回失败，在模态框中显示校验失败的错误信息
//            Map<String, Object> map = new HashMap<>();
//            List<FieldError> errors = result.getFieldErrors();
//            for (FieldError fieldError : errors) {
//                System.out.println("错误的字段名：" + fieldError.getField());
//                System.out.println("错误信息：" + fieldError.getDefaultMessage());
//                map.put(fieldError.getField(), fieldError.getDefaultMessage());
//            }
//            return Msg.fail().add("errorFields", map);
//        }else{
//
//            //上传图片
//            if(picture!=null){
//                //存储图片的物理路径,前端放图片的路径
////                String pic_path = "/Users/chenjiaqi/Documents/mylearningproject/newpos/16wrmis_frontEnd/src/assets/uploadImg";
//                String pic_path = "/Users/chenjiaqi/IdeaProjects/16hmis/src/main/webapp/static/image";
//                //上传图片的原始名称
//                String ori_pic_name =  picture.getOriginalFilename();
//
//                //新的图片名称
//                String  newFileName = UUID.randomUUID() + ori_pic_name.substring(ori_pic_name.lastIndexOf("."));
//
//                File newFile =  new File(pic_path+ newFileName);
//
//                //将内存中的数据写入磁盘,可能会报错，方法需要抛出异常
//                picture.transferTo(newFile);
//
//                //将新的图片名称写到 pojo对象中
//                dish.setPicture(newFileName);
//
//            }
//
//
//            dishService.saveDish(dish);
//            return Msg.success();
//        }
//    }

    //插入图片v3.0,接收商品图片,与表单提交分开进行
//    @ResponseBody
//    @RequestMapping(value = "/dish/uploadpic/{dId}", method = RequestMethod.POST)
//    public Msg saveDish (@RequestParam("dId") Integer dId, MultipartFile picture) throws IOException {
//
//        if(picture!=null){
//                //存储图片的物理路径,前端放图片的路径
////                String pic_path = "/Users/chenjiaqi/Documents/mylearningproject/newpos/16wrmis_frontEnd/src/assets/uploadImg";
//                String pic_path = "/Users/chenjiaqi/IdeaProjects/16hmis/src/main/webapp/static/image";
//                //上传图片的原始名称
//                String ori_pic_name =  picture.getOriginalFilename();
//
//                //新的图片名称
//                String  newFileName = UUID.randomUUID() + ori_pic_name.substring(ori_pic_name.lastIndexOf("."));
//
//                File newFile =  new File(pic_path+ newFileName);
//
//                //将内存中的数据写入磁盘,可能会报错，方法需要抛出异常
//                picture.transferTo(newFile);
//
////                //将新的图片名称写到 pojo对象中
////                dish.setPicture(newFileName);
//            Dish dishNew = new Dish();
//            dishNew.setdId(dId);
//            dishNew.setPicture(newFileName);
//            if(dishService.getDishByDId(dId)!=null){
//                dishService.updateDish(dishNew);
//            }else {
//                dishService.saveDish(dishNew);
//            }
//            dishService.saveDish(dishNew);
//            return Msg.success();
//
//        }else{
//            return Msg.fail().add("message", "图片上传失败！");
//        }
//
//
//    }


    //删除
    @ResponseBody
    @RequestMapping(value="/dish/{dId}",method=RequestMethod.DELETE)
    public Msg deleteDish (@PathVariable("dId") String dId){
        Integer id = Integer.parseInt(dId);

        Dish dish = dishService.getDishByDId(id);
        String delPicture = dish.getPicture();




        //用于直接删除服务器这端的图片
        String pic_path = "/Users/chenjiaqi/IdeaProjects/16hmis/src/main/webapp/static/image/uploadPic/";
        File file = new File(pic_path + delPicture);
        System.out.println("开始删除图片");
        System.out.println(pic_path+delPicture);
        if(!file.exists()){
            System.out.println("删除失败1");
//            return Msg.fail().add("message","图片删除失败，目标图片不存在");
        }else{
            // 如果文件路径所对应的文件存在，并且是一个文件，则直接删除
            if(file.exists()&&file.isFile()){
                if(file.delete()){
                    System.out.println("删除成功");
//                    return Msg.success().add("message", "图片删除成功！");
                }else{
                    System.out.println("删除失败2");
//                    return Msg.fail().add("message","图片删除失败");
                }
            }else{
                System.out.println("删除失败3");
//                return Msg.fail().add("message","图片删除失败，目标图片不存在");
            }
        }


        dishService.deleteDish(id);




        return Msg.success();
    }

    //修改
    @ResponseBody
    @RequestMapping(value="/dish/{dId}",method=RequestMethod.PUT)
    public Msg updateDish (@RequestBody Dish dish) {

        System.out.println(dish.getPrice()+"这是价格");
        dishService.updateDish(dish);
        return  Msg.success();
    }

    @ResponseBody
    @RequestMapping("/dishd/{dName}")
    public Msg getDishByName (@PathVariable("dName") String dName) {
        Dish dish = dishService.getDishByName(dName);
        return Msg.success().add("dish", dish);
    }

    @ResponseBody
    @RequestMapping("/dish/all")
    public Msg getAllDish () {
        List<Dish> dishes = dishService.getAll();
        return Msg.success().add("dishes", dishes);
    }

    @ResponseBody
    @RequestMapping("/dish/{dtId}")
    public Msg getDishByDtId (@PathVariable("dtId") Integer dtId) {
        List<Dish> dishes = dishService.getBydtId(dtId);
        return Msg.success().add("dishes", dishes);
    }

    @ResponseBody
    @RequestMapping("/dish")
    public Msg getDishWithJson(
            @RequestParam(value = "pn", defaultValue = "1") Integer pn) {
        // 这不是一个分页查询
        // 引入PageHelper分页插件
        // 在查询之前只需要调用，传入页码，以及每页的大小
        PageHelper.startPage(pn, 10);
        // startPage后面紧跟的这个查询就是一个分页查询
        List<Dish> dish = dishService.getAll();
        // 使用pageInfo包装查询后的结果，只需要将pageInfo交给页面就行了。
        // 封装了详细的分页信息,包括有我们查询出来的数据，传入连续显示的页数
        PageInfo page = new PageInfo(dish, 10);

        Msg msg = Msg.success().add("pageInfo", page);
        return Msg.success().add("pageInfo", page);
    }
}
